<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>

</body>
<script>
  Function.prototype.bind = function () {
    // debugger
    console.log(arguments)
    var self = this, // 保存原函数
      context = [].shift.call(arguments),// 需要绑定的 this 上下文，第一个参数，obj，记住这么写，好难理解。。。。。。。
      args = [].slice.call(arguments);// 剩余的参数转成数组，后面所有参数，1,2
    console.log('context', context);
    console.log('args', args);
    return function (){
      return self.apply(context, [].concat(args, [].slice.call(arguments)));
      // 执行新的函数的时候，会把之前传入的 context 当作新函数体内的 this
      // 并且组合两次分别传入的参数，作为新函数的参数
    }
  };

  var obj = {
    name: 'shelley'
  };
  var func = function (a, b, c, d) {
    console.log(this.name);// 输出：shelley
    console.log([a,b,c,d]);// 输出：[ 1, 2, 3, 4 ]
  }.bind(obj, 1,2,)

  func(3,4);
</script>
</html>